<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // console.log('start')
        // const p = new Promise((resolve, reject) => {
        //     console.log('1')
        //     resolve('2')
        // })
        // p.then(res => {
        //     console.log(res)
        // })
        // console.log('end')

        // console.log('start')
        // const p = new Promise((resolve, reject) => {
        //     console.log(1)
        //     resolve(2)
        //     console.log(3)
        // })
        // p.then(res => {
        //     console.log(res)
        // })
        // console.log('end')

        // console.log('start')
        // const p = new Promise((resolve, reject) => {
        //     console.log(1)
        // })
        // p.then(res => {
        //     console.log(2)
        // })
        // console.log('end')

        // console.log('start')
        // const fn = () => {
        //     return new Promise((resolve, reject) => {
        //         console.log(1)
        //         resolve(2)
        //     })
        // }
        // console.log(3)
        // fn().then(res => {
        //     console.log(res)
        // })
        // console.log('end')

        // console.log('start')
        // setTimeout(() => {
        //     console.log('setTimeout')
        // }, 0)
        // Promise.resolve().then(() => {
        //     console.log('resolve')
        // })

        // console.log('end')


        // const p = new Promise((resolve, reject) => {
        //     console.log(1)
        //     setTimeout(() => {
        //         console.log('timerStart')
        //         resolve('resolve')
        //         console.log('timerEnd')
        //     }, 0)
        //     console.log(2)
        // })

        // p.then((res) => {
        //     console.log(res)
        // })

        // console.log('end')


        // const timer1 = setTimeout(() => {
        //     console.log(1)

        //     const promise1 = Promise.resolve().then(() => {
        //         console.log('promise1')
        //     })
        // }, 0)

        // const timer2 = setTimeout(() => {
        //     console.log('timer2')
        // }, 0)


        // console.log('start')
        // const promise1 = Promise.resolve().then(() => {
        //     console.log('promise1')
        //     const timer2 = setTimeout(() => {
        //         console.log('timer2')
        //     }, 0)
        // })

        // const timer1 = setTimeout(() => {
        //     console.log('timer1')
        //     const promise2 = Promise.resolve().then(() => {
        //         console.log('promise2')
        //     })
        // }, 0)

        // console.log('end')


        1.
        // new Promise((resolve) => {
        //     resolve();
        // }).then(() => {
        //     console.log(1);
        //     Promise.resolve().then(() => {
        //         console.log(2);
        //     })
        // }).then(() => {
        //     console.log(3);
        // })  //123


        // new Promise((resolve) => {
        //     resolve();
        // }).then(() => {
        //     console.log(1);                                 //nexttick promise asyncawait
        //     Promise.resolve().then(() => {
        //         Promise.resolve().then(() => {
        //             console.log(2);
        //         })
        //     })
        // }).then(() => {
        //     console.log(3);
        // })

        //3
        // new Promise((resolve) => {
        //     resolve();
        // }).then(() => {
        //     console.log(1); 
        //     Promise.resolve().then(() => {
        //         Promise.resolve().then(() => {
        //             console.log(2);
        //         })
        //     })
        // }).then(() => {
        //     console.log(3);
        // }).then(() => {
        //     console.log(4);
        // })

        //4
        // console.log(1);
        // setTimeout(() => {
        //     console.log(2);
        //     Promise.resolve().then(() => {
        //         console.log(3);
        //     })
        // })

        // new Promise((resolve) => {
        //     resolve();
        //     console.log(4);
        // }).then(() => {
        //     console.log(5);
        //     setTimeout(() => {
        //         console.log(6);
        //     })
        // }).then(() => {
        //     console.log(7);
        // })

        // console.log(8);



        //5  ok
        // async function async1() {
        //     await async2()
        //     console.log(1);
        // }
        // async function async2() {
        //     console.log(2);
        //     return Promise.resolve().then(() => {
        //         console.log(3);
        //     })
        // }
        // async1()

        // setTimeout(function () {
        //     console.log(4);
        // }, 0);
        // new Promise(resolve => {
        //     resolve();
        // }).then(function () {
        //     console.log(5);
        // }).then(function () {
        //     console.log(6);
        // })


        //6  2 3 5 6 7 1 4  正确  2 3 5 6  1  7 4 

        // async function async1() {
        //     await async2()
        //     console.log(1);
        // }
        // async function async2() {
        //     console.log(2); ////✅
        //     return Promise.resolve().then(() => {   //async2()函数返回一个Promise对象，所以await async2()会暂停async1()函数的执行，
        //         console.log(3);//✅                  //直到Promise被resolve或reject。
        //     })
        // }
        // async1()
        // setTimeout(function () {
        //     console.log(4);
        // }, 0);
        // new Promise(resolve => {
        //     resolve();
        // }).then(function () {
        //     console.log(5);
        // }).then(function () {
        //     console.log(6);
        // }).then(function () {
        //     console.log(7);
        // })


        //-----------------------
        //8  “1” “10” “16”   7   9  11 2 12 14 13 15 3  5 4 6 17 19 18 20 

        // 微任务：7 9 11 



        //     async function a() {
        //         console.log('1')  //✅
        //         await b();
        //         console.log('2')  //✅
        //     }
        //     // 1
        //     setTimeout(function () {
        //         console.log('3');
        //         // process.nextTick(function () {
        //         //     console.log('4');
        //         // })
        //         new Promise(function (resolve) {
        //             console.log('5');
        //             resolve();
        //         }).then(function () {
        //             console.log('6')
        //         })
        //     })
        //                                                       //8 1 10 16 9 11 12 14 13 15  2  3 5 6 17 19 20    正确答案11之后是2
        //     // 2
        //     // process.nextTick(function () {
        //     //     console.log('7');
        //     // })
        //     // 3
        //     new Promise(function (resolve) {
        //         console.log('8');   //✅
        //         resolve();
        //     }).then(function () {
        //         console.log('9')  //✅
        //     })

        //     function b() {
        //         console.log('10') //✅
        //     }

        //     // 4
        //     new Promise((resolve) => {
        //         resolve();
        //     }).then(() => {  
        //         console.log(11);//✅
        //         Promise.resolve().then(() => { 
        //             console.log(12) //✅
        //             Promise.resolve().then(() => {
        //                 console.log(13); //✅
        //             })
        //         })
        //     }).then(() => {
        //         console.log(14);  //✅
        //     }).then(() => {
        //         console.log(15);  //✅
        //     })
        //     a();  
        //     console.log('16') //✅
        //     // 5
        //     setTimeout(function () {
        //         console.log('17');
        //         // process.nextTick(function () {
        //         //     console.log('18');
        //         // })
        //         new Promise(function (resolve) {
        //             console.log('19');
        //             resolve();
        //         }).then(function () {
        //             console.log('20')
        //         })
        //     })

        // 1、如何保存页面的当前状态    2、对vue组件化的理解。 3、assets和static的区别  4、BFC  5、vuex的几种属性 
        //微任务 1 5 3 6  4

        //8   1 7  8 2 4  5 9 11  12
        // console.log('1');
        // setTimeout(function () {
        //     console.log('2');
        //     new Promise(function (resolve) {
        //         console.log('4');
        //         resolve();
        //     }).then(function () {
        //         console.log('5')
        //     })
        //     // process.nextTick(function () {
        //     //     console.log('3');
        //     // })
        // })

        // new Promise(function (resolve) {
        //     console.log('7');
        //     resolve();
        // }).then(function () {

        //     console.log('8')
        // })

        // // process.nextTick(function () {
        // //     console.log('6');
        // // })

        // setTimeout(function () {
        //     console.log('9');
        //     new Promise(function (resolve) {
        //         console.log('11');
        //         resolve();
        //     }).then(function () {
        //         console.log('12')
        //     })
        //     // process.nextTick(function () {
        //     //     console.log('10');
        //     // })
        // })


        //10    script start    async1 start     async2     promise1   script end   async1 end     promise2    settimeout
        // async function async1() {
        //     console.log('async1 start')
        //     await async2()
        //     console.log('async1 end')
        // }
        // async function async2() {
        //     console.log('async2')
        // }
        // console.log('script start')
        // setTimeout(function () {
        //     console.log('settimeout')
        // })
        // async1()
        // new Promise(function (resolve) {
        //     console.log('promise1')
        //     resolve()
        // }).then(function () {
        //     console.log('promise2')
        // })
        // console.log('script end')

        //11      1  7  8 2 4 5 9 11 12
        // console.log('1');
        // // 定义注解 setTimeout_1 用于下文使用方便
        // setTimeout(function () {
        //     console.log('2');
        //     // process.nextTick(function () {
        //     //     console.log('3');
        //     // })
        //     new Promise(function (resolve) {
        //         console.log('4');
        //         resolve();
        //     }).then(function () {
        //         console.log('5')
        //     })
        // })
        // // process.nextTick(function () {
        // //     console.log('6');
        // // })
        // new Promise(function (resolve) {
        //     console.log('7');
        //     resolve();
        // }).then(function () {
        //     console.log('8')
        // })

        // // setTimeout_2
        // setTimeout(function () {
        //     console.log('9');
        //     // process.nextTick(function () {
        //     //     console.log('10');
        //     // })
        //     new Promise(function (resolve) {
        //         console.log('11');
        //         resolve();
        //     }).then(function () {
        //         console.log('12')
        //     })
        // })


        //12  aaa  p1  res1: hahaha  res2: 9  
        // const promise = new Promise((resolve, reject) => {
        //     resolve("10")
        // }).then(res => {
        //     console.log("res1:", res)    //res1: hahaha
        //     return 9
        // }).then(res => {
        //     console.log("res2:", res)    //res2: 9
        //     return 8
        // }).then(res => {
        //     console.log("res3:", res)    //res3: 8
        //     let promise2 = new Promise((resolve, reject) => {
        //         resolve("p2")
        //     }).then(res => {
        //         console.log(res)
        //         setTimeout(function () {
        //             console.log("setTimeout2")
        //         }, 0)
        //     })
        // })
        // console.log('aaa')
        // setTimeout(function () {
        //     console.log("setTimeout1")
        // }, 0)

        // const promise1 = new Promise((resolve, reject) => {
        //     console.log("p1")
        //     resolve(989)
        // }).then(res => {
        //     console.log(res)
        //     return 990
        // }).then(res => {
        //     console.log(res)
        //     return 991
        // }).then(res => {
        //     console.log(res)
        //     return 0
        // })

        //13  pr1  2 then1   queueMicrotask1  then3 set1  then2 then4 set2
        // setTimeout(function () {
        //     console.log("set1");
        //     new Promise(function (resolve) {
        //         resolve();
        //     }).then(function () {
        //         new Promise(function (resolve) {
        //             resolve();
        //         }).then(function () {
        //             console.log("then4");
        //         });
        //         console.log("then2");
        //     });
        // });

        // new Promise(function (resolve) {
        //     console.log("pr1");
        //     resolve();
        // }).then(function () {
        //     console.log("then1");
        // });

        // setTimeout(function () {
        //     console.log("set2");
        // });

        // console.log(2);

        // queueMicrotask(() => {  /// 是一个函数，它用于将一个微任务（microtask）添加到当前任务队列的末尾
        //     console.log("queueMicrotask1")
        // });

        // new Promise(function (resolve) {
        //     resolve();
        // }).then(function () {
        //     console.log("then3");
        // });


        // 11 12 13
        function fun(...arg){
            if(arg.length>1){
                // 普通函数
                return arg[0]+arg[1]+arg[2];
            }else{
                // 柯里化
                return function (b){
                    return function (c){
                        return arg[0]+b+c
                    }
                }
            }
        }
        console.log(fun(11,12,13))
        console.log(fun(11)(12)(13))
    </script>
</body>

</html>